package pe.com.astech.web.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.astech.web.bean.EmpleadoBean;
import pe.com.astech.web.bean.ExperienciaBean;
import pe.com.astech.web.bean.PerfilBean;
import pe.com.astech.web.bean.UrlBean;
import pe.com.astech.web.bean.UsuarioBean;
import pe.com.astech.web.controller.OrdenTrabajoController;
import pe.com.astech.web.dao.EmpleadoDao;
import pe.com.astech.web.exception.DBException;
import pe.com.astech.web.util.Constantes;

@Repository
public class EmpleadoDaoImpl implements EmpleadoDao {

	private JdbcTemplate jdbcTemplate;
	
	private static final Log log = LogFactory.getLog(EmpleadoDaoImpl.class);

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List<EmpleadoBean> buscarEmpleado(String cadenaTrazabilidad,
			String nombre,String id_perfil){

		String query = "select e.id_empleado,e.nombre,e.apellido_paterno,e.apellido_materno,"
				+ "e.tipo_doc,e.nro_doc from empleado e "
				+ "where concat(e.nombre,e.apellido_paterno,e.apellido_materno) like :nombre and e.perfil_id_perfil=:id_perfil";
		List<EmpleadoBean> list = new ArrayList<EmpleadoBean>();
		log.info(cadenaTrazabilidad + " query : " + query);
		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("id_perfil", id_perfil);
	 	parameters.addValue("nombre", "%"+nombre+"%");
		
	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);
		

			for (Map<String, Object> usrRow : usrRows) {

				EmpleadoBean empleadoBean = new EmpleadoBean();
				empleadoBean.setId_empleado(String.valueOf(usrRow
						.get("id_empleado")));
				empleadoBean.setNombre(String.valueOf(usrRow.get("nombre")));
				empleadoBean.setApellido_paterno(String.valueOf(usrRow
						.get("apellido_paterno")));
				empleadoBean.setApellido_materno(String.valueOf(usrRow
						.get("apellido_materno")));
				empleadoBean
						.setTipo_doc(String.valueOf(usrRow.get("tipo_doc")));
				empleadoBean.setNro_doc(String.valueOf(usrRow.get("nro_doc")));

				list.add(empleadoBean);
				log.info("id_empleado" + usrRow.get("id_empleado"));
			}

		return list;
	}

	@Override
	public EmpleadoBean obtenerEmpleado(String cadenaTrazabilidad,
			String id_empleado, String id_perfil){
		
		String query = "select e.id_empleado,e.nombre,e.apellido_paterno,e.apellido_materno,"
				+ "e.tipo_doc,e.nro_doc from empleado e "
				+ "where e.id_empleado =:id_empleado and e.perfil_id_perfil=:id_perfil";
		EmpleadoBean empleadoBean = new EmpleadoBean();
		log.info("query : " + query);
		
		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("id_empleado", id_empleado);
	 	parameters.addValue("id_perfil", id_perfil);

	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);

			for (Map<String, Object> usrRow : usrRows) {

				empleadoBean.setId_empleado(String.valueOf(usrRow.get("id_empleado")));
				empleadoBean.setNombre(String.valueOf(usrRow.get("nombre")));
				empleadoBean.setApellido_paterno(String.valueOf(usrRow.get("apellido_paterno")));
				empleadoBean.setApellido_materno(String.valueOf(usrRow.get("apellido_materno")));
				empleadoBean.setTipo_doc(String.valueOf(usrRow.get("tipo_doc")));
				empleadoBean.setNro_doc(String.valueOf(usrRow.get("nro_doc")));

				log.info("id_empleado" + usrRow.get("id_empleado"));
			}
		return empleadoBean;
	}
	
	
	@Override
	public List<ExperienciaBean> obtenerExperiencia(String mensajeTrazabilidad,
			String id_empleado, String perfilOperario){
		
		String query = "select ex.empleado_id_empleado,"+
					   "ex.id_experiencia,ex.calificacion,ex.tiempo,ex.observacion,ex.herramienta_ID,h.nombre as nombreHerramienta " +
					   "from empleado e " + 
					   "inner join experiencia_empleado ex on ex.empleado_id_empleado=e.id_empleado " +
					   "inner join herramienta h on h.id_herramienta=ex.herramienta_ID " +
					   "where e.id_empleado =:id_empleado and e.perfil_id_perfil=:perfilOperario";
		List<ExperienciaBean> list = new ArrayList<ExperienciaBean>();
		log.info("query : " + query);

		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("id_empleado", id_empleado);
	 	parameters.addValue("perfilOperario", perfilOperario);

	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(query,parameters);
		

			for (Map<String, Object> usrRow : usrRows) {

				ExperienciaBean experienciaBean = new ExperienciaBean();
				experienciaBean.setId_empleado(String.valueOf(usrRow.get("empleado_id_empleado")));
				experienciaBean.setId_experiencia(String.valueOf(usrRow.get("id_experiencia")));
				experienciaBean.setCalificacion(String.valueOf(usrRow.get("calificacion")));
				experienciaBean.setTiempo(String.valueOf(usrRow.get("tiempo")));
				experienciaBean.setObservacion(String.valueOf(usrRow.get("observacion")));
				experienciaBean.setId_herramienta(String.valueOf(usrRow.get("herramienta_ID")));
				experienciaBean.setHerramienta(String.valueOf(usrRow.get("nombreHerramienta")));
				list.add(experienciaBean);
				log.info("id_empleado = " + usrRow.get("empleado_id_empleado"));
			}
		return list;
	}
	
	@Override
	public void eliminarEmpleado(String cadenaTrazabilidad, String id_empleado){
		String query = "DELETE FROM empleado WHERE id_empleado=:id_empleado";
		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("id_empleado", id_empleado);
	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
		log.info("query : " + query);
		namedParameterJdbcTemplate.update(query, parameters);
	}
	
	@Override
	public void guardarEmpleado(String cadenaTrazabilidad, EmpleadoBean empleadoBean){
		String query = "insert into empleado (nombre,apellido_paterno,apellido_materno,nro_doc,tipo_doc,usuario_id_usuario) " +
			           "values(:nombre,:apellido_paterno,:apellido_materno,:nro_doc,:tipo_doc,:usuario_id_usuario)";
		
		log.info("query : " + query);
		
		MapSqlParameterSource parameters = new MapSqlParameterSource();
	 	parameters.addValue("nombre", empleadoBean.getNombre());
	 	parameters.addValue("apellido_paterno", empleadoBean.getApellido_paterno());
	 	parameters.addValue("apellido_materno", empleadoBean.getApellido_materno());
	 	parameters.addValue("nro_doc", empleadoBean.getNro_doc());
	 	parameters.addValue("tipo_doc", empleadoBean.getTipo_doc());
	 	parameters.addValue("usuario_id_usuario", null);
		
	 	NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
	 	namedParameterJdbcTemplate.update(query,parameters);
	}
	
	
	@Override
	public void guardarExpEmpleado(String cadenaTrazabilidad, ExperienciaBean experienciaBean){
		
		String idExperiencia = experienciaBean.getId_experiencia();
				
		String querySelect = "select ex.id_experiencia from experiencia_empleado ex "
				+ "where  ex.id_experiencia=:idExperiencia";
		
		String queryInsert = "insert into experiencia_empleado (tiempo,calificacion,observacion,herramienta_ID,empleado_id_empleado) " +
		           "values(:tiempo,:calificacion,:observacion,:herramienta_ID,:empleado_id_empleado)";
		
		String queryUpdate = " update experiencia_empleado set " +
							 " tiempo = :tiempo"+
							 " ,calificacion = :calificacion" +
							 " ,observacion = :observacion"+
							 " ,herramienta_ID = :herramienta_ID" +
							 " where id_experiencia = :id_experiencia" ;

			log.info(cadenaTrazabilidad + " querySelect : " + querySelect);
			String resultado = "";
			
			MapSqlParameterSource parametersSelect = new MapSqlParameterSource();
			parametersSelect.addValue("idExperiencia", idExperiencia);
			
			MapSqlParameterSource parametersInsert = new MapSqlParameterSource();
			parametersInsert.addValue("tiempo", experienciaBean.getTiempo());
			parametersInsert.addValue("calificacion", experienciaBean.getCalificacion());
			parametersInsert.addValue("observacion", experienciaBean.getObservacion());
			parametersInsert.addValue("herramienta_ID", experienciaBean.getId_herramienta());
			parametersInsert.addValue("empleado_id_empleado", experienciaBean.getId_empleado());
			
			MapSqlParameterSource parametersUpdate = new MapSqlParameterSource();
			parametersUpdate.addValue("tiempo", experienciaBean.getTiempo());
			parametersUpdate.addValue("calificacion", experienciaBean.getCalificacion());
			parametersUpdate.addValue("observacion", experienciaBean.getObservacion());
			parametersUpdate.addValue("herramienta_ID", experienciaBean.getId_herramienta());
			parametersUpdate.addValue("id_experiencia", experienciaBean.getId_experiencia());
			
			NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
			
			List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(querySelect,parametersSelect);

			for (Map<String, Object> usrRow : usrRows) {
				resultado = String.valueOf(usrRow.get("id_experiencia"));
				log.info(cadenaTrazabilidad + " resultado = " + usrRow.get("id_experiencia"));
			}
			if(Constantes.VACIO.equals(resultado)){
				log.info(cadenaTrazabilidad + " queryInsert : " + queryInsert);
				namedParameterJdbcTemplate.update(queryInsert,parametersInsert);
			}
			else{
				log.info(cadenaTrazabilidad + " queryUpdate : " + queryUpdate);
				namedParameterJdbcTemplate.update(queryUpdate,parametersUpdate);
			}
		
	}

	@Override
	public void eliminarExpEmpleado(String mensajeTrazabilidad,
			ExperienciaBean experienciaBean){

		String idExperiencia = experienciaBean.getId_experiencia();
		
		
		String querySelect = "select ex.id_experiencia from experiencia_empleado ex "
				+ "where  ex.id_experiencia=:idExperiencia";
		
		String queryDelete = " delete from experiencia_empleado" +
							 " where id_experiencia = :idExperiencia ";
		
			log.info(mensajeTrazabilidad + " querySelect : " + querySelect);
			
			MapSqlParameterSource parametersSelect = new MapSqlParameterSource();
			parametersSelect.addValue("idExperiencia", idExperiencia);
			
			MapSqlParameterSource parametersDelete = new MapSqlParameterSource();
			parametersDelete.addValue("idExperiencia", idExperiencia);
			
			String resultado = "";
			
			NamedParameterJdbcTemplate namedParameterJdbcTemplate= new NamedParameterJdbcTemplate(jdbcTemplate);
			List<Map<String, Object>> usrRows = namedParameterJdbcTemplate.queryForList(querySelect,parametersSelect);

			for (Map<String, Object> usrRow : usrRows) {
				resultado = String.valueOf(usrRow.get("id_experiencia"));
				log.info(mensajeTrazabilidad + " resultado = " + usrRow.get("id_experiencia"));
			}
			if(!Constantes.VACIO.equals(resultado)){
				log.info(mensajeTrazabilidad + " queryDelete : " + queryDelete);
				namedParameterJdbcTemplate.update(queryDelete,parametersDelete);
			}
		
	}

	
}
